
const express = require('express'); 
const jwt = require('jsonwebtoken');

const app = express();


app.get('/api/get', verifyToken, (req, res)=>{

    // 在接口中采用jwt来验证数据； 第一个参数为： token; 第二个参数为 私钥； 第三个参数为回调函数；
    jwt.verify(req.token, 'secretkey', (err, tokenData)=>{
        if (err) {
            res.sendStatus(403);
        } else {
            console.log(JSON.stringify(req.headers))
            res.json({
                message: 'this is get api',
                status: 200
            })
        }
    })
})


// 添加一个带有jwt较验的接口
app.post('/api/userinfo', verifyToken, (req, resp)=>{
    console.log('my self config variable = ' + req.verifyinfo);
    // 在接口体内，需要判断jwttoken有有效性 如果有效返回相应的数， 否则提示没有权限获取接口数据
    jwt.verify(req.token, 'secretkey', (err, tokenData)=>{
        if (err) {
            console.log(JSON.stringify(err));
            resp.json({
                errinfo: '没有权限获取接口数据，token无效...',
                status: 403
            })
        } else {
            // 构造一个用户对象
            const user = {
                id: 2,
                username: 'brenda',
                email:'ant_loiter@126.com'
            };
            resp.json({user})
        }
    })
})

// 这个方法主要是在post的请求之前处理一下验证信息， 重新设置一下req里面头部数据
function verifyToken (req, resp, next) {

    console.log('req header info = ' + JSON.stringify(req.headers));
    // 从请求的头里面获取authorizationinfo信息
    const bearerHeader = req.headers['authorization'];
    // 判断其有效性
    if (typeof bearerHeader !== 'undefined') {
        // 开发分析bearerHeader ，采用空隔截取
        const bearer = bearerHeader.split(' ');
        // 获取真正的token信息
        const bearerToken = bearer[1] || null;
        // 获取token分析协议名
        const bearerPro = bearer[0] || '';
        console.log('协议名为= ' + bearerPro);
        if (bearerPro === 'bearer') {
            // 获取
            req.token = bearerToken;
            req.verifyinfo = 'brendatoken' + Math.random() * 1000;
            
            setTimeout(() => {
                next()
            }, Math.random()* 1000);

        } else {
            resp.json({
                errinfo: '接口token协议名错误， 无权获取接口数据...',
                status: 403
            })
        }
    } else {
        // resp.sendStatus(403);
        resp.json({
            errinfo: '没有权限获取接口数据',
            status: 403
        })

    }

}


// 添加login接口， 在这个接口里面，如要账号密码验证通过后， 签发jwttoken
app.post('/api/login', (req,resp)=>{
    // 构造一个用户对象
    const user = {
        id: 2,
        username: 'brenda',
        email:'ant_loiter@126.com'
    };
    // 签发令牌
    jwt.sign({user}, 'secretkey', (err, token)=>{
        if (err) {
            resp.sendStatus(403);
        } else {
            resp.json({
                user,
                token
            })
        }
    })
})


app.listen(5001, ()=>{
    console.log('Server is started port 5001...')
})